﻿
#pragma once
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <vector>
#include <string>
#include <memory>
#include <map>
#include <any>

enum class ITCatTablePropertiesEnum {
    DWSTYLE,                    //样式
    CLR_BACKGROUND,             //背景
    CLR_SELECTED,               //选中项背景色
    CLR_SELECTED_UNFOCUSED,     //选中项无焦点时的背景色
    CLR_HOT,                    //鼠标悬浮色
    CLR_COLHEADER,              //列标题背景色
    CLR_ROWHEADER,              //行标题背景色
    CLR_GRID,                   //网格颜色
    CLR_TEXT,                   //文本颜色
    CLR_COLHEADTEXT,            //列标题文本色
    CLR_ROWHEADTEXT,            //行标题文本色
    CLR_BORDER,                 //边框色
    CLR_HOTBORDER,              //鼠标悬浮边框色
    COLHEADER_HEIGHT,           //列标题高度
    ROWHEADER_WIDTH,            //行标题宽度
    ROW_HEIGHT,                 //行高
    CELLMARGIN,                 //单元格边距
    ROWHEADER_STYLE,            //行标题显示样式
    SEPARATOR_ALIGNMENT,        //分隔行对齐方式
    DW_BOOL,                    //用位来存储多个bool值
    COUNT                       //计数用
};

class ITCatTableBase
{
public:
    ITCatTableBase();
    DWORD GetProperty(ITCatTablePropertiesEnum propertyKey) const;
    void SetProperty(ITCatTablePropertiesEnum propertyKey,DWORD value);
    const std::map<ITCatTablePropertiesEnum, DWORD> & GetProperties();
    void SetProperties(const std::map<ITCatTablePropertiesEnum, DWORD>& properties);

    // 样式位操作方法
    void AddStyle(DWORD styleFlags);    // 增加样式（置1）
    void RemoveStyle(DWORD styleFlags); // 移除样式（置0）
    bool GetStyle(DWORD styleFlags) const;    // 获取样式位

    // DW_BOOL位操作方法
    void SetBoolFlag(DWORD boolFlags);    // 设置bool位（置1）
    void ClearBoolFlag(DWORD boolFlags);  // 清除bool位（置0）
    bool GetBoolFlag(DWORD boolFlags);    // 获取bool位

    std::any tag; // 可存储任意类型数据

    //设置和获取文本内容
    const wchar_t* getText();
    void setText(const wchar_t* text);
    
    // 颜色设置和获取方法
    void SetBackgroundColor(COLORREF color);
    void SetCustomTextColor(COLORREF color);
    COLORREF GetBackgroundColor() const;
    COLORREF GetTextColor() const;
    bool HasCustomBackgroundColor() const;
    bool HasCustomTextColor() const;

protected:
    //此处为行和单元格有到的属性，默认从properties继承，可以单独设置。
    bool isSelected = false;
    bool isHot = false;
    int index = -1;
    int height = 0;
    
    //是否允许选中
    bool isSelectEnable = true;

    int colspan = 1;  //为1时表示正常单元格，为0时表示被左侧单元格合并了，大于1表示要合并右侧的单元格。
    int rowspan = 1;  //为1时表示正常单元格，为0时表示被上侧单元格合并了，大于1表示要合并下侧的单元格。
    
    // 颜色属性（可单独设置）
    COLORREF backgroundColor = CLR_INVALID;  // 背景色，CLR_INVALID表示使用继承的颜色
    COLORREF textColor = CLR_INVALID;       // 文字颜色，CLR_INVALID表示使用继承的颜色

protected:
    std::map<ITCatTablePropertiesEnum, DWORD> m_properties;
    std::wstring _Text;     //如果是表格，为表格的说明文字，如果是行，为行标题文字，如果是单元格，为单元格文字。

public:
    //常量定义
    static constexpr DWORD SHOW_COL_HEADER = 0x0001; // DW_BOOL第一位：显示列标题
    static constexpr DWORD SHOW_ROW_HEADER = 0x0002; // DW_BOOL第二位：显示行标题

    // 控件样式
    static constexpr DWORD LVS_DEFAULT        = 0x00000000;
    static constexpr DWORD LVS_BORDER         = 0x00000001;  // 边框
    static constexpr DWORD LVS_GRID           = 0x00000002;  // 网格线
    static constexpr DWORD LVS_FULLROWSELECT  = 0x00000004;  // 整行选择
    static constexpr DWORD LVS_MULTISELECT    = 0x00000008;  // 多选
    static constexpr DWORD LVS_CHECKBOX       = 0x00000008;  // 复选框
    static constexpr DWORD LVS_FLAT_BORDER    = 0x00000010;  // 非3D边框（平面边框）
    
    // 行样式
    static constexpr DWORD ROW_SEPARATOR      = 0x00000020;  // 分隔行

    // 列对齐方式
    static constexpr int LVCA_LEFT   = DT_LEFT;
    static constexpr int LVCA_CENTER = DT_CENTER;
    static constexpr int LVCA_RIGHT  = DT_RIGHT;

    // 行标题显示样式
    static constexpr int ROWHEADER_TEXT      = 0;  // 显示文本
    static constexpr int ROWHEADER_NUMBER    = 1;  // 显示序号
    static constexpr int ROWHEADER_CHECKBOX  = 2;  // 显示复选框
    static constexpr int ROWHEADER_ICON      = 3;  // 显示图标
};

